package com.xscha.tableforge.service;

import com.xscha.tableforge.model.dto.RelationMetaDto;
import com.xscha.tableforge.model.entity.RelationMeta;

import java.util.List;
import java.util.Map;
import java.util.Optional;

/**
 * 关联字段元数据服务接口
 */
public interface RelationMetaService {
    
    /**
     * 根据ID查询关联字段元数据
     *
     * @param id 关联字段ID
     * @return 关联字段元数据
     */
    Optional<RelationMeta> findById(String id);
    
    /**
     * 根据字段ID查询关联字段元数据
     *
     * @param fieldId 字段ID
     * @return 关联字段元数据
     */
    Optional<RelationMeta> findByFieldId(String fieldId);
    
    /**
     * 根据表ID查询所有关联字段元数据
     *
     * @param tableId 表ID
     * @return 关联字段元数据列表
     */
    List<RelationMeta> findAllByTableId(String tableId);
    
    /**
     * 创建关联字段元数据
     *
     * @param relationMetaDto 关联字段元数据DTO
     * @param userId 创建者用户ID
     * @return 创建成功的关联字段元数据
     */
    RelationMeta createRelationMeta(RelationMetaDto relationMetaDto, String userId);
    
    /**
     * 更新关联字段元数据
     *
     * @param id 关联字段ID
     * @param relationMetaDto 关联字段元数据DTO
     * @param userId 更新者用户ID
     * @return 更新后的关联字段元数据
     */
    RelationMeta updateRelationMeta(String id, RelationMetaDto relationMetaDto, String userId);
    
    /**
     * 删除关联字段元数据
     *
     * @param id 关联字段ID
     * @param userId 删除者用户ID
     */
    void deleteRelationMeta(String id, String userId);
    
    /**
     * 创建关联关系
     *
     * @param relationFieldId 关联字段ID
     * @param sourceRecordId 源记录ID
     * @param targetRecordId 目标记录ID
     * @param userId 创建者用户ID
     */
    void createRelation(String relationFieldId, String sourceRecordId, String targetRecordId, String userId);
    
    /**
     * 批量创建关联关系
     *
     * @param relationFieldId 关联字段ID
     * @param sourceRecordId 源记录ID
     * @param targetRecordIds 目标记录ID列表
     * @param userId 创建者用户ID
     */
    void createRelations(String relationFieldId, String sourceRecordId, List<String> targetRecordIds, String userId);
    
    /**
     * 删除关联关系
     *
     * @param relationFieldId 关联字段ID
     * @param sourceRecordId 源记录ID
     * @param targetRecordId 目标记录ID
     */
    void deleteRelation(String relationFieldId, String sourceRecordId, String targetRecordId);
    
    /**
     * 删除源记录的所有关联关系
     *
     * @param relationFieldId 关联字段ID
     * @param sourceRecordId 源记录ID
     */
    void deleteAllRelations(String relationFieldId, String sourceRecordId);
    
    /**
     * 获取关联记录ID列表
     *
     * @param relationFieldId 关联字段ID
     * @param sourceRecordId 源记录ID
     * @return 关联记录ID列表
     */
    List<String> getRelatedRecordIds(String relationFieldId, String sourceRecordId);
    
    /**
     * 批量获取关联记录ID
     *
     * @param relationFieldId 关联字段ID
     * @param sourceRecordIds 源记录ID列表
     * @return 关联记录ID映射，key为源记录ID，value为目标记录ID列表
     */
    Map<String, List<String>> getRelatedRecordsMap(String relationFieldId, List<String> sourceRecordIds);
    
    /**
     * 获取引用特定目标记录的所有源记录ID
     *
     * @param relationFieldId 关联字段ID
     * @param targetRecordId 目标记录ID
     * @return 源记录ID列表
     */
    List<String> getSourceRecordIdsByTargetRecordId(String relationFieldId, String targetRecordId);
}